使用平移操纵器可以使用户在 Kanzi 应用程序中移动节点。平移操纵器是一种输入操纵器,您可以用于在 Kanzi 应用程序中添加手势识别到节点上。平移手势跟踪在设备屏幕上移动的指针位置,以计算移动节点的量。
在教程的这一步中,使用平移操纵器移动地图。
本教程的起点资料存储在 <KanziWorkspace>/Tutorials/Pan zoom tap/Start 目录中。
<KanziWorkspace>/Tutorials/Pan zoom tap/Completed 目录包含本教程已完成的工程。
起点工程包含完成本教程所需的内容:
这一节中,您创建平移操纵器,并在用户将指针放到地图上并移动指针时使用平移操纵器移动地图。
要平移地图:
如果您在 Visual Studio 2017 中打开教程解决方案,遇到提示您重新定位工程到最新的 Microsoft 工具集时,请点击取消 (Cancel)。
要从 Kanzi Studio 打开 Kanzi Studio 工程的目录,选择 > 在 Windows 资源管理器中打开 (Open in Windows Explorer)。
PanZoomTap
类的公有部分定义 PanManipulator::MovedMessage
消息的处理程序:private:
// 为 PanManipulator::MovedMessage
消息定义处理程序,该消息来自
//具有可生成平移消息的输入操纵器的 2D 节点。
//此处理程序为平移手势的量变换 2D 节点。
void onPanMoved(PanManipulator::MovedMessageArguments& messageArguments)
{
//从消息参数获得用户平移的节点。
Node2DSharedPtr mapNode = dynamic_pointer_cast<Node2D>(messageArguments.getSource());
//获取自平移手势队列中最后一条消息起
//平移的像素距离。
Vector2 translationDelta = messageArguments.getDelta();
//获取 Map 节点的 渲染变换 (Render Transformation) 属性。
SRTValue2D mapNodeSRT = mapNode->getRenderTransformation();
//获取 Map 节点的当前变换。
Vector2 translation = mapNodeSRT.getTranslation();
//从平移消息应用变换。
Vector2 translationTarget = translation - translationDelta;
//获取 Map 节点的父节点。
Node2D* containerNode = dynamic_cast<Node2D*>(mapNode->getParent());
//获取父节点的大小。
Vector2 containerSize = containerNode->getActualSize();
//获取 Map 节点的 渲染变换 (Render Transformation) 属性 缩放 (Scale) 属性字段。
Vector2 mapScale = mapNodeSRT.getScale();
//计算 Map 节点的缩放大小。
Vector2 mapSizeScaled = componentWiseMultiply(mapNode->getActualSize(), mapScale);
//不要超出 Map 节点的边界平移。
//计算边界时,考虑当前地图比例。
if (mapScale.getX() >= 1.0f)
{
translationTarget = componentWiseMax(componentWiseMin(translationTarget, (mapSizeScaled - containerSize) / 2), (containerSize - mapSizeScaled) / 2);
}
else if (mapScale.getX() < 1.0f)
{
translationTarget = componentWiseMin(componentWiseMax(translationTarget, (containerSize - mapSizeScaled) / 2), (mapSizeScaled - containerSize) / 2);
}
//设置新变换。
mapNodeSRT.setTranslation(translationTarget);
//应用新变换到 Map 节点。
mapNode->setRenderTransformation(mapNodeSRT);
}
onProjectLoaded
() 函数中创建 PanManipulator
操纵器并订阅 Map 节点的消息:virtual void onProjectLoaded() KZ_OVERRIDE { //域指针。 Domain* domain = getDomain(); //获取屏幕 (Screen) 节点。 ScreenSharedPtr screen = getScreen(); //使用节点的别名获取 Map 节点。 Node2DSharedPtr mapNode = screen->lookupNode<Node2D>("#Map"); //创建生成平移消息的输入操纵器。 PanManipulatorSharedPtr panManipulator = PanManipulator::create(domain); //设置水平和垂直轴的阈值(以像素为单位), //在输入操纵器识别平移手势之前,指针需要移动轴。 panManipulator->setRecognitionThreshold(Vector2(10.0f, 10.0f)); //添加输入操纵器到 Map 节点。 mapNode->addInputManipulator(panManipulator); //订阅 Map 节点的PanManipulator::MovedMessage
消息。 //当用户在水平或垂直轴上移动指针超过识别阈值并且指针在更新之间移动时,PanManipulator
//生成此消息。 mapNode->addMessageHandler(PanManipulator::MovedMessage, bind(&PanZoomTap::onPanMoved, this, placeholders::_1)); }
要详细了解关于在 Kanzi 中处理用户输入的详细信息,请参阅处理用户输入。
要详细了解平移操纵器,请参阅使用平移操纵器。
要详细了解 Kanzi 中的别名,请参阅使用别名。